const rawArray = [1, [2, 3, [4, 5, [6, 7]]], 'name', null, [NaN, null, undefined, [{},
	['hello', 'world']
]]]

// 1、Array.prototype.flat()
let flatArray = rawArray.flat(Infinity)
console.log('Array.prototype.flat() 不改变原数组:', flatArray);

// 2、Array.prototype.toString()+Array.prototype.split()+Array.prototype.map()
let tostringArray = rawArray.toString().split(',').map(item => Number(item))
console.log('Array.prototype.toString() 不改变原数组:', flatArray);

// 3、Array.prototype.concat()+Array.prototype.some()
function concatArray(array) {
	while (array.some(item => Array.isArray(item))) {
		array = [].concat(...array)
	}
	return array
}
console.log('Array.prototype.concat() 不改变原数组:', concatArray(rawArray));


// 4、使用Generator函数
let flat = function*(array) {
	for (let i = 0; i < array.length; i++) {
		if (Array.isArray(array[i])) {
			yield* flat(array[i]) //递归
		} else {
			yield array[i]
		}

	}
}
console.log('使用Generator函数 不改变原数组:', [...flat(rawArray)]);

// 5、Array.reduce((total, value, index, array)=>{},initVal)+Array.prototype.concat()
function flatten(array, deep = 1) {
	if (deep <= 0) return array;
	return array.reduce((preval, curval) => {
		return preval.concat(Array.isArray(curval) ? flatten(curval) : curval)
	}, [])
}

console.log('Array.reduce() 不改变原数组:', flatten(rawArray, Infinity));

// 6、原生
let flatArr = []
let flattenArray = (array) => {
	for (let item of array) {
		if (Array.isArray(item)) {
			flattenArray(item)
		} else {
			flatArr.push(item)
		}
	}
	return flatArr
}
console.log('原生 不改变原数组:', flattenArray(rawArray));
console.log('原数组=：', rawArray);